package com.sjz.mp3;

import java.io.File;

import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class AudioplayerActivity extends Activity {
	private EditText nameText;  //文件名
    private String path;    //上传路径
    private MediaPlayer mediaPlayer;  //音乐播放器对象
    private boolean pause;  //是否暂停
    private int position;  //播放的位置
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mediaPlayer = new MediaPlayer();  //创建音乐播放器对象
        nameText = (EditText) this.findViewById(R.id.filename);   //得到播放音乐的内容
        
        
        // Context.TELEPHONY_SERVICE 值是"phone"
         //取得电话管理服务  这样的话，只对电话来进行处理 其他情况下能一直播放音乐  
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        //设置一个监听  需要传一个实现类  一个电话呼叫状态 PhoneStateListener.LISTEN_CALL_STATE（32）
        telephonyManager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }
    
    /****
     * 电话监听类 
     *
     */
    private final class MyPhoneListener extends PhoneStateListener{
 		public void onCallStateChanged(int state, String incomingNumber) {
 			switch (state) {
 			case TelephonyManager.CALL_STATE_RINGING://来电
 				if(mediaPlayer.isPlaying()) {  //判断是否正在播放
 					position = mediaPlayer.getCurrentPosition();//得到播放位置
 					mediaPlayer.stop();//停止播放
 				}
 				break;

 			case TelephonyManager.CALL_STATE_IDLE://电话挂断 
 				if(position>0 && path!=null){//播放位置存在  文件存在 
 					play(position);//从播放位置进行播放
 					position = 0; //播放位置设置成0
 				}
 				break;
 			}
 		}
     }
     /*
    onPause 如果不在前台的话，这个方法会被执行
     @Override
 	protected void onPause() {
 		if(mediaPlayer.isPlaying()) {
 			position = mediaPlayer.getCurrentPosition();
 			mediaPlayer.stop();
 		}
 		super.onPause();
 	}
  
    //恢复到前台的话，继续从设置的位置来进行播放    
 	@Override
 	protected void onResume() {
 		if(position>0 && path!=null){
 			play(position);
 			position = 0;
 		}
 		super.onResume();
 	}
 	注释掉的代码有一个缺陷是 如果有特殊需求的话，不能满足  
 	
 */
 	@Override
 	protected void onDestroy() {
     	mediaPlayer.release();
     	mediaPlayer = null;
 		super.onDestroy();
 	}

 	/****
 	 * 点击按钮触发的事件
 	 * @param v
 	 */
 	public void mediaplay(View v){
     	switch (v.getId()) {
 		case R.id.playbutton:   //播放
 			String filename = nameText.getText().toString();    //得到sd卡文件的内容
 			//得到sd卡的根路径  Environment.getExternalStorageDirectory()
 			File audio = new File(Environment.getExternalStorageDirectory(), filename);
 			if(audio.exists()){ //如果文件存在  得到文件的路径
 				path = audio.getAbsolutePath();
 				play(0);//播放文件
 			}else{ //如果文件不存在 提示文件不存在 
 				path = null;
 				Toast.makeText(getApplicationContext(), R.string.filenoexist, 1).show();
 			}
 			break;
 			
 		case R.id.pausebutton:   //暂停
 			if(mediaPlayer.isPlaying()){  //如果正在播放
 				mediaPlayer.pause();//暂停
 				pause = true;  
 				((Button)v).setText(R.string.continues);  //设置继续文字提示
 			}else{//没有播放
 				if(pause){   //如果是暂停的话，继续播放
 					mediaPlayer.start();//继续播放
 					pause = false;
 					((Button)v).setText(R.string.pausebutton); //设置暂停文字提示
 				}
 			}
 			break;
 		case R.id.resetbutton:    //重播按钮
 			if(mediaPlayer.isPlaying()){ //如果正在播放  把位置设置成0 来设置重新播放
 				mediaPlayer.seekTo(0);//从开始位置播放音乐
 			}else{//否则判断文件是否存在  如果存在 继续播放
 				if(path!=null){
 					play(0);   
 				}
 			}
 			break;
 		case R.id.stopbutton:	  //停止按钮
 			if(mediaPlayer.isPlaying()) mediaPlayer.stop();   //如果正在播放   调用停止播放方法
 			break;
 		}
     }
  
 	/*****
 	 * 播放音乐   
 	 * @param position  播放位置
 	 */
 	private void play(int position) {
 		try {
 			mediaPlayer.reset();//把各项参数恢复到初始状态
 			mediaPlayer.setDataSource(path);//设置文件
 			mediaPlayer.prepare();//进行缓冲
 			mediaPlayer.setOnPreparedListener(new PrepareListener(position)); //缓存好后的监听类
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
 	
 	/****
 	 * 文件缓存好后的监听的类
 	 *
 	 */
 	private final class PrepareListener implements OnPreparedListener{
 		private int position;   //文件播放的位置
 		public PrepareListener(int position) {
 			this.position = position;
 		}

 		public void onPrepared(MediaPlayer mp) {
 			mediaPlayer.start();//开始播放
 			if(position>0) mediaPlayer.seekTo(position);  //如果文件有位置的话，在设置的位置来进行播放
 		}
 	}
}